#include <iostream>
#include <cstring>

class MyString {
private:
    char* str;
public:
    // 构造函数
    MyString(const char* s) {
        str = new char[strlen(s) + 1];
        strcpy(str, s);
    }

    // 移动构造函数
    MyString(MyString&& other) {
        str = other.str;
        other.str = nullptr;
    }

    // 析构函数
    ~MyString() {
        delete[] str;
    }

    // 获取字符串内容
    const char* getStr() const {
        return str;
    }
};

int main() {
    MyString str1("Hello");

    // 创建一个临时对象，调用移动构造函数
    MyString str2 = MyString("World");

    std::cout << "str1: " << str1.getStr() << std::endl;
    std::cout << "str2: " << str2.getStr() << std::endl;

    return 0;
}


// 在上面的代码中，我们定义了一个 MyString 类，它包含了一个指向字符数组的指针 str。
// 我们实现了一个常规构造函数来初始化字符串，并实现了一个移动构造函数。
// 在移动构造函数中，我们接受一个右值引用 MyString&& other 作为参数。
// 我们将 other 的指针 str 移动到当前对象中，然后将 other 的指针置为空指针，
// 以避免在 other 对象被销毁时出现重复释放内存的问题。

// 在 main 函数中，我们创建了两个 MyString 对象 str1 和 str2。
// 在创建 str2 时，我们直接传递一个临时对象作为参数，这会调用移动构造函数，将临时对象的内容移动到 str2 中，而不是进行深拷贝。

// 这样，我们就可以避免不必要的内存复制，提高了程序的性能。这是右值引用在实践中的一个简单示例。